package it.bela.pgcdc.service.impl;

import java.util.List;

import it.bela.pgcdc.common.exception.ServiceException;
import it.bela.pgcdc.common.utils.Utilities;
import it.bela.pgcdc.dao.ContattoDao;
import it.bela.pgcdc.domain.Contatto;
import it.bela.pgcdc.service.ContattoService;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
@Service
@Transactional(rollbackFor = ServiceException.class)
public class ContattoServiceImpl implements ContattoService {
	
	private static final Logger log = Logger.getLogger(ContattoServiceImpl.class);
	
	@Autowired(required = true)
	private ContattoDao contattoDao;
	
	private boolean hasValidKey(Contatto contatto) {
		return (contatto.getId() != 0);
	}

	@Override
	public List<Contatto> findByExample(Contatto contatto) throws ServiceException {
		
		try {
			log.debug("Start list Contatto");
			
			contatto = (Contatto) Utilities.setDefaultParametersSelect(contatto);
			
			List<Contatto> list = contattoDao.findByExample(contatto);
			
			log.debug("End list Contatto");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample Contatto failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public List<Contatto> list() throws ServiceException {
		
		try {
			log.debug("Start list");
			
			Contatto contatto = new Contatto();
			
			contatto = (Contatto) Utilities.setDefaultParametersSelect(contatto);

			List<Contatto> list = contattoDao.findByExample(contatto);
			
			log.debug("End list");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean delete(Contatto contatto) throws ServiceException {
		log.debug(contatto.getClass().toString() + " - Start delete");
		
		String message = contatto.getClass().toString() + " - delete Contatto failed.";
		try {
			if (!hasValidKey(contatto)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			contatto = (Contatto) contattoDao.findById(contatto.getClass(), contatto.getId());
			contattoDao.delete(contatto);
			
			log.debug(contatto.getClass().toString() + " - End delete Contatto");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean persist(Contatto contatto) throws ServiceException {
		log.debug(contatto.getClass().toString() + " - Start persist Contatto");
		
		String message = contatto.getClass().toString() + " - persist Contatto failed.";
		try {
			
			contatto = (Contatto) Utilities.setDefaultParametersInsert(contatto);
			contattoDao.persist(contatto);
			
			log.debug(Contatto.class.toString() + " - End persist Contatto");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean save(Contatto contatto) throws ServiceException {
		log.debug(contatto.getClass().toString() + " - Start save Contatto");
		
		String message = Contatto.class.toString() + " - save Contatto failed.";
		try {
			
			contatto = (Contatto) Utilities.setDefaultParametersInsert(contatto);
			contattoDao.save(contatto);
			
			log.debug(Contatto.class.toString() + " - End save Contatto");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean merge(Contatto contatto) throws ServiceException {
		log.debug(Contatto.class.toString() + " - Start merge Contatto");
		
		String message = Contatto.class.toString() + " - merge Contatto failed.";
		try {
			if (!hasValidKey(contatto)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			contatto = (Contatto) Utilities.setDefaultParametersUpdate(contatto);
			contattoDao.merge(contatto);
			
			log.debug(Contatto.class.toString() + " - End merge Contatto");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public Contatto findById(Class<Contatto> classe, Long id)throws ServiceException {
		log.debug(Contatto.class.toString() + " - Start findById Contatto");
		
		String message = Contatto.class.toString() + " - findById Contatto failed.";
		try {
			
			Contatto contatto = (Contatto) contattoDao.findById(classe, id);
			
			log.debug(Contatto.class.toString() + " - End findById Contatto");
			return contatto;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
}
